package com.proyecto.seguridad.modelo.servicio;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;

import com.proyecto.core.modelo.echo.constantes.ParametrosIniciales;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.core.modelo.servicio.interfaces.IServicioSeguridad;

public class ServicioSegOperacionesUsuarios extends ServicioGenerico implements IServicioSeguridad {

	public ArrayList<Integer> opcionesIMEC(String usuarioCod, String OpcionCod) {
		
		String query = "select new List(segOpeUsr.acceder as A, segOpeUsr.incluir as I, segOpeUsr.modificar as M, segOpeUsr.eliminar as E, " +
		"segOpeUsr.consultar as C) from SegOperacionesUs segOpeUsr  " +
				"where  segOpeUsr.id.ciaopr = '1' " +
					" and segOpeUsr.id.usuariocodigo = '"+usuarioCod+"' " +
					" and segOpeUsr.id.operacioncod = '"+OpcionCod+"' " ;
		

		ArrayList lista = (ArrayList) propiedadDAO.ejecutarQueryConsulta(query);
		
		ArrayList<Integer> opcionesIMEC = new ArrayList<Integer>();
		if (lista != null && lista.size() > 0){
			opcionesIMEC.add(Integer.valueOf(((List)lista.get(0)).get(0).toString()));//A Acceder
			opcionesIMEC.add(Integer.valueOf(((List)lista.get(0)).get(1).toString()));//I incluir
			opcionesIMEC.add(Integer.valueOf(((List)lista.get(0)).get(2).toString()));//M modificar
			opcionesIMEC.add(Integer.valueOf(((List)lista.get(0)).get(3).toString()));//E elimiar
			opcionesIMEC.add(Integer.valueOf(((List)lista.get(0)).get(4).toString()));//C consultar
		}else{
			opcionesIMEC.add(0);//A Acceder
			opcionesIMEC.add(0);//I incluir
			opcionesIMEC.add(0);//M modificar
			opcionesIMEC.add(0);//E elimiar
			opcionesIMEC.add(0);//C consultar
		}
		return opcionesIMEC;
	}

	public ArrayList obtenerSeccionesPorUsuario(String usuarioCod,ArrayList<String> secciones) {
		
		if (ParametrosIniciales.SUPER_USUARIO.equalsIgnoreCase(usuarioCod)){
			//hacer consultas a base de datos.... como se indica arriba...
			return null;
		}
		String querySecciones = "segOpeUsr.id.operacioncod in (";
		
		for(int i = 0 ; i< secciones.size(); i++){
			String OpeCod = "'"+secciones.get(i);
			if(i!=secciones.size()-1){
				OpeCod = OpeCod + "',";
			}else{
				OpeCod = OpeCod + "')";
			}
			
			querySecciones = querySecciones.concat(OpeCod);
		}
		
		String query = "select new List(segOpe.id.operacioncod , segOpe.operacionnombre as Expediente, segOpe.operacionobjeto as Ventana, " +
						"segOpeUsr.acceder as A, segOpeUsr.incluir as I, segOpeUsr.modificar as M, segOpeUsr.eliminar as E, " +
						"segOpeUsr.consultar as C) " +
							"from SegOperaciones segOpe, SegOperacionesUs segOpeUsr  " +
								"where segOpeUsr.id.usuariocodigo = '"+usuarioCod+"' " +
									" and segOpeUsr.id.ciaopr = segOpe.id.ciaopr  " +
									" and segOpeUsr.id.operacioncod = segOpe.id.operacioncod  " +
									"and " + querySecciones;
		
		ArrayList listaSecciones = (ArrayList) propiedadDAO.ejecutarQueryConsulta(query);
		
		return listaSecciones;
	}

	
	
	
	public  ArrayList<Integer> buscarOpcion(String usuarioCod, String OpcionCod, ArrayList listaDeSeccionesPermitidas) {
		
		ArrayList<Integer> listImecPosee = new ArrayList<Integer>();
		
		if (ParametrosIniciales.SUPER_USUARIO.equalsIgnoreCase(usuarioCod)//Si es el usuario administrador del sistema
				||ParametrosIniciales.USUARIO_ROOT.equalsIgnoreCase(usuarioCod)){//O si es el usuario root del sistema.
			listImecPosee.add(1);//A Acceder
			listImecPosee.add(1);//I incluir
			listImecPosee.add(1);//M modificar
			listImecPosee.add(1);//E elimiar
			listImecPosee.add(1);//C consultar.
			return listImecPosee;
		
		}
		for(int i=0; i< listaDeSeccionesPermitidas.size(); i++){
				if(((List)listaDeSeccionesPermitidas.get(i)).get(0).toString().equals(OpcionCod)){
					listImecPosee.add(Integer.valueOf(((List)listaDeSeccionesPermitidas.get(i)).get(3).toString()));//A acceder
					listImecPosee.add(Integer.valueOf(((List)listaDeSeccionesPermitidas.get(i)).get(4).toString()));//I incluir
					listImecPosee.add(Integer.valueOf(((List)listaDeSeccionesPermitidas.get(i)).get(5).toString()));//M modificar
					listImecPosee.add(Integer.valueOf(((List)listaDeSeccionesPermitidas.get(i)).get(6).toString()));//E eliminar
					listImecPosee.add(Integer.valueOf(((List)listaDeSeccionesPermitidas.get(i)).get(7).toString()));//C consultar
				}
			}
		
		
		return listImecPosee;
	}

	public boolean esAutorizado(String usuarioCod, ArrayList<Integer> AIMEC) {
		
		//Logica para saber si un usuarioCod puede ver un expediente determinado
		if (ParametrosIniciales.SUPER_USUARIO.equalsIgnoreCase(usuarioCod)){
			return true;
		}else{
			if(AIMEC.get(0).intValue()== 1){
				return true;
			}else{
				return false;
			}
			
		}
	}
	
	/**
	 * Este metodo permite saber si un usuario puede acceder a una determinada opcion
	 * mediante su usuario, su clave, la opcion a la que se desea saber si puede acceder
	 * y un booleano que indica si la clave la esta recibiendo encriptada o no.
	 * @param ciaopr
	 * @param usuario
	 * @param clave
	 * @param operacion
	 */
	public boolean accedeAOpcion(String ciaopr, String usuario, String clave, String operacion, Boolean claveEncriptada){
		if(usuario.equals(ParametrosIniciales.USUARIO_ROOT)|| usuario.equals(ParametrosIniciales.SUPER_USUARIO)){
			return true;
		}
		String sqlClave = "";
		if(!claveEncriptada){
			sqlClave = " and su.usuarioclave = (select md5('"+clave+"')) ";
		}else{
			sqlClave = " and su.usuarioclave = '"+clave+"'";
		}
		String queryString = "select sou.acceder from seg_usuarios su " +
				"				inner join seg_operaciones_us sou " +
				"				on sou.ciaopr = su.ciaopr " +
				"				and sou.usuariocodigo = su.usuariocodigo " +
				"				and su.ciaopr = '"+ciaopr+"' " +
				"				and su.usuariocodigo = '"+usuario+"' " +sqlClave+
				"				and sou.operacioncod = '"+operacion+"'";
		List listaResultado = null;
		Session s = propiedadDAO.getSessionFactory().openSession();
		try{
			s.getTransaction().begin();
			listaResultado = s.createSQLQuery(queryString).list();
			s.getTransaction().commit();
		}catch (Exception e) {
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally{
			s.close();
		}
		if(listaResultado!=null && //Si el resultado es distinto de null
				listaResultado.size()>0 && //Si hay almenos un resultado
				listaResultado.get(0).toString().equalsIgnoreCase("1")//Si ese resultado es 1
				){
			return true;//Entonces retorna verdadero
		}else{
			return false;//Caso contrario retorna falso..
		}
		
	}


}
